/**
 * Created with hong.rong
 * Description:*
 * Date:2020/06/25
 */

import React from 'react'

function computeHeight(node) {
  const { style } = node
  style.height = '100%'
  const totalHeight = parseInt(`${getComputedStyle(node).height}`, 10)
  const padding =
    parseInt(`${getComputedStyle(node).paddingTop}`, 10) +
    parseInt(`${getComputedStyle(node).paddingBottom}`, 10)
  return totalHeight - padding
}

function getAutoHeight(n) {
  if (!n) {
    return 0
  }

  const node = n

  let height = computeHeight(node)
  const parentNode = node.parentNode
  if (parentNode) {
    height = computeHeight(parentNode)
  }

  return height
}

function autoHeight() {
  return WrappedComponent => {
    class AutoHeightComponent extends React.Component {
      state = {
        computedHeight: 0,
      }

      root = undefined

      componentDidMount() {
        const { height } = this.props
        if (!height) {
          let h = getAutoHeight(this.root)
          this.setState({ computedHeight: h })
          if (h < 1) {
            h = getAutoHeight(this.root)
            this.setState({ computedHeight: h })
          }
        }
      }

      handleRoot = node => {
        this.root = node
      }

      render() {
        const { height } = this.props
        const { computedHeight } = this.state
        const h = height || computedHeight
        return (
          <div ref={this.handleRoot}>
            {h > 0 && <WrappedComponent {...this.props} height={h} />}
          </div>
        )
      }
    }
    return AutoHeightComponent
  }
}
export default autoHeight
